package com.grape.result;

import com.alibaba.fastjson.JSON;
import com.grape.dto.ImNoticeDTO;
import com.grape.enums.IMResultEnums;
import lombok.Data;

import java.io.Serializable;

/**
 * @author  putao
 * @email   2628279194@qq.com
 */
@Data
public class ImServerResult implements Serializable {

    /** 签名 */
    private String sign;
    /** 是否成功 */
    private boolean success;
    /** 数据 */
    private Object data;
    /** key */
    private String key;
    /** 消息 */
    private String message;
    /** token */
    private String token;

    /** 用户不存在 */
    public static final String SIGN_USER_NOT_EXIST = "user_not_exist";
    /** 超时 二维码登录场景：二维码超时 */
    public static final String SIGN_TIME_OUT = "time_out";
    /** 登录成功 */
    public static final String SIGN_LOGIN_SUCCESS = "login_success";
    /** 扫码成功 */
    public static final String SIGN_SCAN_SUCCESS = "scan_success";
    /** 取消登录 用户扫码后，取消登录 */
    public static final String SIGN_CANCEL_LOGIN_PC = "cancel_login_pc";
    /** 心跳检测电话 */
    public static final String SIGN_HEARTBEAT_DETECTION = "heartbeat_detection";

    public ImServerResult(boolean success, String sign, Object data, String key, String message, String token) {
        this.success = success;
        this.sign = sign;
        this.data = data;
        this.key = key;
        this.message = message;
        this.token = token;
    }

    /**
     * 用户不存在
     * @return          用户不存在封装对象
     */
    public static ImServerResult notice(ImNoticeDTO ImNoticeDTO, String token) {
        IMResultEnums notice = IMResultEnums.NOTICE;
        return new ImServerResult(notice.isSuccess(), notice.getSign(), JSON.toJSONString(ImNoticeDTO), notice.getKey(), notice.getMessage(), token);
    }

    /**
     * 同一个用户同一个设备类型重复登录后移除旧的
     * @return      登录覆盖封装对象
     */
    public static ImServerResult override(String token) {
        IMResultEnums notice = IMResultEnums.OVERRIDE;
        return new ImServerResult(notice.isSuccess(), notice.getSign(), null, notice.getKey(), notice.getMessage(), token);
    }

    /**
     * 新消息推送通知
     * @param ImNoticeDTO      通知
     * @return              新消息通知封装对象
     */
    public static ImServerResult newMessage(ImNoticeDTO ImNoticeDTO, String token) {
        IMResultEnums notice = IMResultEnums.NEW_MESSAGE;
        return new ImServerResult(notice.isSuccess(), notice.getSign(), JSON.toJSONString(ImNoticeDTO), notice.getKey(), notice.getMessage(), token);
    }

    /**
     * 推送减少角标通知
     * @param ImNoticeDTO      通知
     * @return              减少角标通知封装对象
     */
    public static ImServerResult reduceBadge(ImNoticeDTO ImNoticeDTO, String token) {
        IMResultEnums notice = IMResultEnums.NEW_MESSAGE;
        return new ImServerResult(notice.isSuccess(), notice.getSign(), JSON.toJSONString(ImNoticeDTO), notice.getKey(), notice.getMessage(), token);
    }

    /**
     * 用户不存在
     * @return          用户不存在封装对象
     */
    public static ImServerResult typeError(String token) {
        IMResultEnums typeError = IMResultEnums.TYPE_ERROR;
        return new ImServerResult(typeError.isSuccess(), typeError.getSign(), typeError.getData(), typeError.getKey(), typeError.getMessage(), token);
    }

    /**
     * 用户不存在
     * @return          用户不存在封装对象
     */
    public static ImServerResult userNotExist(String token) {
        IMResultEnums userNotExist = IMResultEnums.USER_NOT_EXIST;
        return new ImServerResult(userNotExist.isSuccess(), userNotExist.getSign(), userNotExist.getData(), userNotExist.getKey(), userNotExist.getMessage(), token);
    }

    /**
     * 超时 二维码登录场景：二维码超时
     * @param data      数据
     * @param key       key
     * @param message   消息
     * @return          超时封装对象
     */
    public static ImServerResult timeOut(Object data, String key, String message, String token) {
        return new ImServerResult(false, SIGN_TIME_OUT, data, key, message, token);
    }

    /**
     * 登录成功
     * @param data      数据
     * @return          登录成功封装对象
     */
    public static ImServerResult loginSuccess(Object data, String token) {
        return new ImServerResult(true, SIGN_LOGIN_SUCCESS, data, SIGN_LOGIN_SUCCESS, "登录成功", token);
    }

    /**
     * 扫码成功
     * @param data      数据
     * @return          扫码成功封装对象
     */
    public static ImServerResult scanSuccess(Object data, String token) {
        return new ImServerResult(true, SIGN_SCAN_SUCCESS, data, SIGN_LOGIN_SUCCESS, "扫码成功，请在手机端确认登录", token);
    }

    /**
     * 取消登录 用户扫码后，取消登录
     * @param data      数据
     * @return          取消登录 用户扫码后，取消登录 封装对象
     */
    public static ImServerResult cancelLoginPc(Object data, String token) {
        return new ImServerResult(true, SIGN_CANCEL_LOGIN_PC, data, SIGN_CANCEL_LOGIN_PC, "用户已取消登录", token);
    }

}
